﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class PartidoController : Controller
    {
        private IRepositorioPartidos repositorioPartidos;
        private IRepositorioLiga repositorioLigas;
        private IRepositorioUsuario1 repositorioUsuario;

        public PartidoController() : this(new RepositorioPartidos(), new RepositorioLiga(), new RepositorioUsuario()) { }

        public PartidoController(IRepositorioPartidos repoPartidos, IRepositorioLiga repoLiga, IRepositorioUsuario1 repoUsuario)
        {
            repositorioPartidos = repoPartidos;
            repositorioLigas = repoLiga;
            repositorioUsuario = repoUsuario;
        }
        //
        // GET: /Partido/

        
        public ActionResult Index()
        {
            HttpCookie cookie = HttpContext.Request.Cookies["IdLiga"];
            //!!Verificar antes y etc...
            Liga ligaActual = repositorioLigas.getLiga(Convert.ToInt32(cookie.Value));
            List<Partido> partidos = ligaActual.Partidos.ToList();
            ViewData["CantidadEquipos"] = ligaActual.Equipos.Count;

            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            ViewData["Usuario"] = "";
            if (usuarioActual != null)
                ViewData["Usuario"] = usuarioActual.TipoDeUsuario.TipoDeUsuario1; 

            if (partidos.Count == 0)
                return View("SinPartidos");
            return View(partidos);
        }

        public ActionResult Fecha(int idFecha, int idLiga)
        {
            Liga liga = repositorioLigas.getLiga(idLiga);
            List<Partido> partidos = repositorioPartidos.PartidosPorFecha(liga, idFecha).ToList<Partido>();
            if (partidos.Count == 0)
                return View("SinPartidos");
            return View(partidos);
        }

        //
        // GET: /Partido/Details/5

        public ActionResult Details(int id)
        {
            Partido partido = repositorioPartidos.GetPartido(id);

            if (partido != null)
                return View(partido);
            else
                return View("PartidoNoExiste");
        }

        //
        // GET: /Partido/Edit/5
        [Authorize]
        public ActionResult Edit(int id)
        {
            Partido partido = repositorioPartidos.GetPartido(id);
            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            
            if (usuarioActual.TipoDeUsuario.TipoDeUsuario1 != "admin")
                return View("AccesoDenegado");
            return View(partido);
        }

        //
        // POST: /Partido/Edit/5

        [AcceptVerbs(HttpVerbs.Post), Authorize]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                Partido partido = repositorioPartidos.GetPartido(id);
                int exA = 0;
                int exB = 0;
                int expA =0;
                int expB=0;
                if(partido.Jugado!=null)
                    if ((bool)partido.Jugado)
                    {
                        exA = (int)partido.GolesA;
                        exB = (int)partido.GolesB;

                        partido.Equipo.GF -= exA;
                        partido.Equipo.GC -= exB;
                        partido.Equipo1.GF -= exB;
                        partido.Equipo1.GC -= exA;
                        partido.Equipo.DG -= (exA - exB);
                        partido.Equipo1.DG -= (exB - exA);

                        if (exA > exB)
                        {
                            expA = 3;
                            partido.Equipo.PG--;
                            partido.Equipo1.PP--;
                        }
                        else if (exA < exB)
                        {
                            expB = 3;
                            partido.Equipo.PP--;
                            partido.Equipo1.PG--;
                        }
                        else 
                        {
                            expA = 1;
                            expB = 1;
                            partido.Equipo.PE--;
                            partido.Equipo1.PE--;
                        }

                        partido.Equipo.PJ--;
                        partido.Equipo1.PJ--;
                    }

                partido.Equipo.Puntos -= expA;
                partido.Equipo1.Puntos -= expB;

                partido.Equipo.PJ++;
                partido.Equipo1.PJ++;

                int golesA = Convert.ToInt32(collection["GolesA"]);
                int golesB = Convert.ToInt32(collection["GolesB"]);
                string detalles = collection["Detalles"];
                partido.GolesA = golesA;
                partido.GolesB = golesB;
                partido.Detalles = detalles;

                Equipo ra = partido.Equipo;
                Equipo rb = partido.Equipo1;

                ra.GF += golesA;
                ra.GC += golesB;
                ra.DG += golesA - golesB;

                rb.GF += golesB;
                rb.GC += golesA;
                rb.DG += golesB - golesA;

                if (partido.GolesA > partido.GolesB)
                {
                    ra.Puntos+=3;
                    ra.PG ++;
                    rb.PP++;
                }
                else if (partido.GolesA == partido.GolesB)
                {
                    ra.Puntos += 1;
                    rb.Puntos += 1;
                    ra.PE++;
                    rb.PE++;
                }
                else 
                {
                    rb.Puntos += 3;
                    ra.PP++;
                    rb.PG++;
                }

                repositorioPartidos.Save();

                return RedirectToAction("Goleadores", new { id = partido.IDPartido });
            }
            catch
            {
                //!!Falta lo de los errores.
                return View();
            }
        }

        public ActionResult Goleadores(int id)
        {
            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            Partido partido = repositorioPartidos.GetPartido(id);

            List<Jugadore> jugadoresA = partido.Equipo.Jugadores.ToList<Jugadore>();
            ViewData["JugadoresA"] = new SelectList(jugadoresA);
            List<Jugadore> jugadoresB = partido.Equipo1.Jugadores.ToList<Jugadore>();
            ViewData["JugadoresB"] = new SelectList(jugadoresB);
            
            if (usuarioActual.TipoDeUsuario.TipoDeUsuario1 != "admin")
                return View("AccesoDenegado");
            return View(partido);
        }

        [HttpPost, Authorize]
        public ActionResult Goleadores(int id, FormCollection collection)
        {
            Partido partido = repositorioPartidos.GetPartido(id);
            List<Jugadore> jugadoresA = partido.Equipo.Jugadores.ToList<Jugadore>();
            List<Jugadore> jugadoresB = partido.Equipo1.Jugadores.ToList<Jugadore>();

            for(int i = 0; i < partido.GolesA; i++) {
                String jugador = collection["GA" + i];
                String[] ids = jugador.Split(' ');

                foreach(Jugadore j in jugadoresA)
                {
                    if (j.Nombre == ids[0] && j.Apellido == ids[1])
                        j.GolesAcumulados++;
                }
            }

            for (int i = 0; i < partido.GolesB; i++)
            {
                String jugador = collection["GB" + i];
                String[] ids = jugador.Split(' ');

                foreach (Jugadore j in jugadoresB)
                {
                    if (j.Nombre == ids[0] && j.Apellido == ids[1])
                        j.GolesAcumulados++;
                }
            }
            partido.Jugado = true;
            repositorioPartidos.Save();

            return RedirectToAction("Details", new { id = partido.IDPartido });
        }
    }
}
